###Install packages *** ###Load libraries

library(raster)
Loading required package: sp
library(tidyverse)
── Attaching packages ───────────────────────────────────────────────────────────── tidyverse 1.2.1 ──
✔ ggplot2 3.1.0     ✔ purrr   0.2.5
✔ tibble  2.0.0     ✔ dplyr   0.7.8
✔ tidyr   0.8.2     ✔ stringr 1.3.1
✔ readr   1.3.1     ✔ forcats 0.3.0
package ‘tibble’ was built under R version 3.5.2── Conflicts ──────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ tidyr::extract() masks raster::extract()
✖ dplyr::filter()  masks stats::filter()
✖ dplyr::lag()     masks stats::lag()
✖ dplyr::select()  masks raster::select()
library(ggthemes)
library(patchwork)
library(maptools)
Checking rgeos availability: TRUE
library(ggmap)
Google Maps API Terms of Service: http://developers.google.com/maps/terms.
Please cite ggmap if you use it: see citation("ggmap") for details.
library(marmap)

Attaching package: ‘marmap’

The following object is masked from ‘package:raster’:

    as.raster

The following object is masked from ‘package:grDevices’:

    as.raster

###Part 1: Outline maps

usa <- map_data(map="state")

Attaching package: ‘maps’

The following object is masked from ‘package:purrr’:

    map
us_missouri <- map_data(map="state",
                        region="missouri")
us_other <- subset(x=usa,
                   subset=region %in% c("alabama",
                                        "florida",
                                        "mississippi",
                                        "north carolina"))
str(usa)
'data.frame':   15537 obs. of  6 variables:
 $ long     : num  -87.5 -87.5 -87.5 -87.5 -87.6 ...
 $ lat      : num  30.4 30.4 30.4 30.3 30.3 ...
 $ group    : num  1 1 1 1 1 1 1 1 1 1 ...
 $ order    : int  1 2 3 4 5 6 7 8 9 10 ...
 $ region   : chr  "alabama" "alabama" "alabama" "alabama" ...
 $ subregion: chr  NA NA NA NA ...
ggplot()+
  geom_polygon(data=us_other,
               aes(x=long,
                   y=lat,
                   group=group),
               fill = "gray")

ggplot()+
  geom_polygon(data = us_other,
               aes(x=long,
                   y=lat,
                   group=group),
               fill="gray")+
  geom_polygon(data=us_missouri,
               aes(x=long,
                   y=lat,
                   group=group),
               fill="black")

ggplot()+
  geom_polygon(data = us_other,
               aes(x=long,
                   y=lat,
                   group=group),
               fill="gray")+
  geom_polygon(data=us_missouri,
               aes(x=long,
                   y=lat,
                   group=group),
               fill="black")+
  geom_polygon(data = usa,
               aes(x=long,
                   y=lat,
                   group=group),
               fill=NA,
               color="black")

us_map <- ggplot()+
  geom_polygon(data = us_other,
               aes(x=long,
                   y=lat,
                   group=group),
               fill="gray")+
  geom_polygon(data=us_missouri,
               aes(x=long,
                   y=lat,
                   group=group),
               fill="black")+
  geom_polygon(data=usa,
               aes(x=long,
                   y=lat,
                   group=group),
               fill=NA,
               color="black")+
  theme_map()+
  coord_fixed(1.3)
us_map

#Missouri map

missouri <- map_data("county", "missouri")
mo_scott <- subset(missouri, subregion %in% c("scott"))
mo_map <- ggplot()+
  geom_polygon(data=missouri, aes(x=long, y=lat, group=group), fill=NA, color="black")+
  geom_polygon(data=mo_scott, aes(x=long, y=lat, group=group), fill="black")+
  theme_map()+
  coord_fixed(1.3)
mo_map

us_map + mo_map + plot_layout(ncol = 2, widths = c(1.5, 1))

#Outline Maps #This should be interesting… I was born in Hawaii. It isn’t part of the map_data, so I’ll choose Utah, where I lived for two years and learned to ski. I lived in Ogden in Weber county. My initials are AKC. The counties I chose to put in gray are Kane and Carbon.

us_utah <- map_data(map="state",
                      region = "utah")
utah <- map_data("county", "utah")
ut_birth <- subset(utah, subregion %in% c("weber"))
ut_names <- subset(utah, subregion %in% c("carbon", "kane"))

akc_usa <- ggplot()+
  geom_polygon(data = us_utah,
               aes(x = long,
               y = lat,
               group = group),
               fill = "black")+
  geom_polygon(data = usa,
               aes(x = long,
               y = lat,
               group = group),
               fill = NA,
               color = "black")+
  theme_map()+
  coord_fixed(1.3)

akc_counties <- ggplot()+
  geom_polygon(data = ut_birth,
               aes(x = long,
                   y = lat,
                   group = group),
               fill = "black")+
  geom_polygon(data = ut_names,
               aes(x = long,
                   y = lat,
                   group = group),
               fill = "gray")+
  geom_polygon(data = utah,
               aes(x = long,
                   y = lat,
                   group = group),
               fill = NA,
               color = "black")+
  theme_map()+
  coord_fixed(1.3)

akc_usa + akc_counties + plot_layout(ncol = 2, widths = c(1.5,1))

#The Hawaii Gambit… Born on Oahu, and have visited Hawaii (the big island) and Maui. I’ll see if I can get that to work. I love working with maps.

hawaii <- map_data("world", "USA:Hawaii")
hawaii_oahu <- map_data("world", "USA:Hawaii:Oahu")
other_islands <- map_data("world", c("USA:Hawaii:Hawaii", "USA:Hawaii:Maui"))

akc_usa <- ggplot()+
  geom_polygon(data = us_utah,
               aes(x = long,
               y = lat,
               group = group),
               fill = "black")+
  geom_polygon(data = usa,
               aes(x = long,
               y = lat,
               group = group),
               fill = NA,
               color = "black")+
  theme_map()+
  coord_fixed(1.3)

akc_hawaii <- ggplot()+
  geom_polygon(data = hawaii,
               aes(x = long,
                   y = lat,
                   group = group),
               fill = NA,
               color = "black")+
  geom_polygon(data = hawaii_oahu,
               aes(x = long,
                   y = lat,
                   group = group),
               fill = "black")+
  geom_polygon(data = other_islands,
               aes(x = long,
                   y = lat,
                   group = group),
               fill = "gray")+
  theme_map()+
  coord_fixed(1.3)
akc_usa + akc_hawaii + plot_layout(ncol = 2, widths = c(1.5, 1))

#Hmm. The big island of Hawaii didn’t show up as gray. I guess the name in map_data is different. The code is there that would select it. On to Part 2!


###Part 2: Dot distribution maps ###Load the libraries #already loaded ###Define some variables. set.seed value as in assignment so I can see if I’m doing it right!

min_long <- -126
max_long <- -104
min_lat <- 31
max_lat <- 50

set.seed(9618973)
file_path <-"~/Documents/BI685Files/GitHubDocs/chronister_andrew/data"

###Read in the “Gigantopithecus” data

bigfoot <- read.csv(file.path(file_path, "bigfoot.csv"))

bigfoot <- filter(bigfoot,
                  long >= min_long & long <= max_long,
                  lat >= min_lat & lat <= max_lat) %>%
  sample_n(300) %>%
  mutate(name = "Gigantiopithecus") %>%
  select(name, long, lat)

#Read in the bears data

bears <- read_csv(file.path(file_path, "bears.csv"))
Parsed with column specification:
cols(
  name = col_character(),
  long = col_double(),
  lat = col_double()
)
both_species <- bind_rows(bigfoot, bears)

head(both_species)
tail(both_species)

#Get terrain map

base = get_stamenmap(bbox = c(min_long,
                              min_lat,
                              max_long,
                              max_lat),
                     zoom = 4,
                     maptype = "terrain-background")
ggmap(base)

base <- ggmap(base)

base + geom_point(data = bigfoot,
                  aes(x = long,
                      y = lat))

base + geom_point(data = bears,
                  aes(x = long,
                  y = lat))

#Both species

base + geom_point(data = both_species,
                  aes(x = long,
                      y = lat,
                      shape = name,
                      fill = name),
                  size = 2)+
  scale_shape_manual(values = c(22:23))+
  labs(x = "Longitude",
       y = "Latitude",
       fill = "Species",
       shape = "Species")


###Recreate with SO number as seed.

set.seed(1065450)
#I could just redo everything from here with the existing code and should get the new results.  
bigfoot <- read_csv(file.path(file_path, "bigfoot.csv"))
Parsed with column specification:
cols(
  long = col_double(),
  lat = col_double()
)
bigfoot <- filter(bigfoot,
                   long >= min_long & long <= max_long,
                   lat >= min_lat & lat <= max_lat) %>%
  sample_n(300) %>%
  mutate(name = "Gigantopithecus") %>%
  select(name, long, lat)

#Bears data already read in.

both_species <- bind_rows(bigfoot, bears)

head(both_species)
tail(both_species)
base = get_stamenmap(bbox = c(min_long,
                              min_lat,
                              max_long,
                              max_lat),
                     zoom = 4,
                     maptype = "terrain-background")

base <- ggmap(base)
base + geom_point(data = both_species,
                  aes(x = long,
                      y = lat,
                      shape = name,
                      fill = name),
                  size = 2)+
  scale_shape_manual(values = c(22:23))+
  labs(x = "Longitude",
       y = "Latitude",
       fill = "Species",
       shape = "Species")


###Part3: Bathymetry ###Load the libraries #Already loaded ###Define the variables

min_long <- -170
max_long <- 164
min_lat <- -42
max_lat <- -8

earthquakes <- quakes %>%
  mutate(depth = depth * 3280.84)

#load NOAA data

fiji <- getNOAA.bathy(lon1 = min_long,
                      lon2 = max_long,
                      lat1 = min_lat,
                      lat2 = max_lat,
                      antimeridian = TRUE,
                      keep = TRUE)
Querying NOAA database ...
This may take seconds to minutes, depending on grid size
Building bathy matrix ...
autoplot.bathy(fiji,
               geom = c("raster", "contour"),
               size = 0.3,
               na.rm = TRUE)
Ignoring unknown parameters: size

autoplot(fiji,
         geom = c("raster", "contour"),
         size = 0.1,
         na.rm = TRUE)+
  scale_fill_gradient2(low = "dodgerblue4",
                       mid = "gainsboro",
                       high = "darkgreen",
                       name = "Depth (ft)")+
  labs(x = "Longitude",
       y = "Latitude")+
  theme(axis.title.y = element_text(angle = 0,
                                    vjust = 0.5))
Ignoring unknown parameters: size

base_map <- autoplot(fiji,
         geom = c("raster", "contour"),
         size = 0.1,
         na.rm = TRUE)+
  scale_fill_gradient2(low = "dodgerblue4",
                       mid = "gainsboro",
                       high = "darkgreen",
                       name = "Depth (ft)")+
  labs(x = "Longitude",
       y = "Latitude")+
  theme(axis.title.y = element_text(angle = 0,
                                    vjust = 0.5))
Ignoring unknown parameters: size
base_map + geom_point(data = earthquakes,
                      aes(x = long,
                      y = lat))

#Use alpha arguement

base_map + geom_point(data = earthquakes,
                      aes(x = long,
                          y = lat,
                          size = mag),
                      alpha = 0.4)

#scale size a little smaller

base_map + geom_point(data = earthquakes,
                      aes(x = long,
                          y = lat,
                          size = mag),
                      alpha = 0.4) +
  scale_size_continuous(range = c(0.5, 3), name = "Magnitude")


###Now you try it. *** ###Set new variables

min_long <- -90
max_long <- -58
min_lat <- 8
max_lat <- 28

#Read in the data

blennies <- read_csv(file.path(file_path, "blennies.csv"))
Parsed with column specification:
cols(
  name = col_character(),
  long = col_double(),
  lat = col_double()
)
blennies

#Get the caribbean data

carib_sea <- getNOAA.bathy(lon1 = min_long,
                           lon2 = max_long,
                           lat1 = min_lat,
                           lat2 = max_lat,
                           antimeridian = FALSE,
                           keep = TRUE)
Querying NOAA database ...
This may take seconds to minutes, depending on grid size
Building bathy matrix ...

#Use autoplot for the base map

base_map <- autoplot(carib_sea,
         geom = c("raster", "contour"),
         size = 0.1,
         na.rm = TRUE) +
  scale_fill_etopo(guide = FALSE)+
  labs(x = "Longitude",
       y = "Latitude")+
  theme(axis.title.y = element_text(angle = 0,
                                    vjust = 0.5))
Ignoring unknown parameters: size
base_map

#Add the blennies

base_map + geom_point(data = blennies,
                      aes(x = long,
                          y = lat,
                          shape = name),
                      fill = "white",
                      size = 3.2)+
  scale_shape_manual(values = c(21:23))+
  labs(shape = "Species")+
  theme(legend.position = "bottom")+
  theme(legend.text = element_text(face = "italic"))

LS0tCnRpdGxlOiAiSFcxMDogTWFwcyIKYXV0aG9yOiAiQW5kcmV3IENocm9uaXN0ZXIiCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCICVZJylgIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKZWRpdG9yX29wdGlvbnM6IAogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUKLS0tCgoqKioKIyMjSW5zdGFsbCBwYWNrYWdlcwoqKioKIyMjTG9hZCBsaWJyYXJpZXMKYGBge3J9CmxpYnJhcnkocmFzdGVyKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShnZ3RoZW1lcykKbGlicmFyeShwYXRjaHdvcmspCmxpYnJhcnkobWFwdG9vbHMpCmxpYnJhcnkoZ2dtYXApCmxpYnJhcnkobWFybWFwKQpgYGAKKioqCiMjI1BhcnQgMTogT3V0bGluZSBtYXBzCmBgYHtyfQp1c2EgPC0gbWFwX2RhdGEobWFwPSJzdGF0ZSIpCnVzX21pc3NvdXJpIDwtIG1hcF9kYXRhKG1hcD0ic3RhdGUiLAogICAgICAgICAgICAgICAgICAgICAgICByZWdpb249Im1pc3NvdXJpIikKdXNfb3RoZXIgPC0gc3Vic2V0KHg9dXNhLAogICAgICAgICAgICAgICAgICAgc3Vic2V0PXJlZ2lvbiAlaW4lIGMoImFsYWJhbWEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZsb3JpZGEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1pc3Npc3NpcHBpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3J0aCBjYXJvbGluYSIpKQpgYGAKCmBgYHtyfQpzdHIodXNhKQpgYGAKYGBge3J9CmdncGxvdCgpKwogIGdlb21fcG9seWdvbihkYXRhPXVzX290aGVyLAogICAgICAgICAgICAgICBhZXMoeD1sb25nLAogICAgICAgICAgICAgICAgICAgeT1sYXQsCiAgICAgICAgICAgICAgICAgICBncm91cD1ncm91cCksCiAgICAgICAgICAgICAgIGZpbGwgPSAiZ3JheSIpCmBgYAoKYGBge3J9CmdncGxvdCgpKwogIGdlb21fcG9seWdvbihkYXRhID0gdXNfb3RoZXIsCiAgICAgICAgICAgICAgIGFlcyh4PWxvbmcsCiAgICAgICAgICAgICAgICAgICB5PWxhdCwKICAgICAgICAgICAgICAgICAgIGdyb3VwPWdyb3VwKSwKICAgICAgICAgICAgICAgZmlsbD0iZ3JheSIpKwogIGdlb21fcG9seWdvbihkYXRhPXVzX21pc3NvdXJpLAogICAgICAgICAgICAgICBhZXMoeD1sb25nLAogICAgICAgICAgICAgICAgICAgeT1sYXQsCiAgICAgICAgICAgICAgICAgICBncm91cD1ncm91cCksCiAgICAgICAgICAgICAgIGZpbGw9ImJsYWNrIikKYGBgCgpgYGB7cn0KZ2dwbG90KCkrCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSB1c19vdGhlciwKICAgICAgICAgICAgICAgYWVzKHg9bG9uZywKICAgICAgICAgICAgICAgICAgIHk9bGF0LAogICAgICAgICAgICAgICAgICAgZ3JvdXA9Z3JvdXApLAogICAgICAgICAgICAgICBmaWxsPSJncmF5IikrCiAgZ2VvbV9wb2x5Z29uKGRhdGE9dXNfbWlzc291cmksCiAgICAgICAgICAgICAgIGFlcyh4PWxvbmcsCiAgICAgICAgICAgICAgICAgICB5PWxhdCwKICAgICAgICAgICAgICAgICAgIGdyb3VwPWdyb3VwKSwKICAgICAgICAgICAgICAgZmlsbD0iYmxhY2siKSsKICBnZW9tX3BvbHlnb24oZGF0YSA9IHVzYSwKICAgICAgICAgICAgICAgYWVzKHg9bG9uZywKICAgICAgICAgICAgICAgICAgIHk9bGF0LAogICAgICAgICAgICAgICAgICAgZ3JvdXA9Z3JvdXApLAogICAgICAgICAgICAgICBmaWxsPU5BLAogICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siKQpgYGAKCmBgYHtyfQp1c19tYXAgPC0gZ2dwbG90KCkrCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSB1c19vdGhlciwKICAgICAgICAgICAgICAgYWVzKHg9bG9uZywKICAgICAgICAgICAgICAgICAgIHk9bGF0LAogICAgICAgICAgICAgICAgICAgZ3JvdXA9Z3JvdXApLAogICAgICAgICAgICAgICBmaWxsPSJncmF5IikrCiAgZ2VvbV9wb2x5Z29uKGRhdGE9dXNfbWlzc291cmksCiAgICAgICAgICAgICAgIGFlcyh4PWxvbmcsCiAgICAgICAgICAgICAgICAgICB5PWxhdCwKICAgICAgICAgICAgICAgICAgIGdyb3VwPWdyb3VwKSwKICAgICAgICAgICAgICAgZmlsbD0iYmxhY2siKSsKICBnZW9tX3BvbHlnb24oZGF0YT11c2EsCiAgICAgICAgICAgICAgIGFlcyh4PWxvbmcsCiAgICAgICAgICAgICAgICAgICB5PWxhdCwKICAgICAgICAgICAgICAgICAgIGdyb3VwPWdyb3VwKSwKICAgICAgICAgICAgICAgZmlsbD1OQSwKICAgICAgICAgICAgICAgY29sb3I9ImJsYWNrIikrCiAgdGhlbWVfbWFwKCkrCiAgY29vcmRfZml4ZWQoMS4zKQp1c19tYXAKYGBgCiNNaXNzb3VyaSBtYXAgCmBgYHtyfQptaXNzb3VyaSA8LSBtYXBfZGF0YSgiY291bnR5IiwgIm1pc3NvdXJpIikKbW9fc2NvdHQgPC0gc3Vic2V0KG1pc3NvdXJpLCBzdWJyZWdpb24gJWluJSBjKCJzY290dCIpKQptb19tYXAgPC0gZ2dwbG90KCkrCiAgZ2VvbV9wb2x5Z29uKGRhdGE9bWlzc291cmksIGFlcyh4PWxvbmcsIHk9bGF0LCBncm91cD1ncm91cCksIGZpbGw9TkEsIGNvbG9yPSJibGFjayIpKwogIGdlb21fcG9seWdvbihkYXRhPW1vX3Njb3R0LCBhZXMoeD1sb25nLCB5PWxhdCwgZ3JvdXA9Z3JvdXApLCBmaWxsPSJibGFjayIpKwogIHRoZW1lX21hcCgpKwogIGNvb3JkX2ZpeGVkKDEuMykKbW9fbWFwCmBgYAoKYGBge3J9CnVzX21hcCArIG1vX21hcCArIHBsb3RfbGF5b3V0KG5jb2wgPSAyLCB3aWR0aHMgPSBjKDEuNSwgMSkpCmBgYAojT3V0bGluZSBNYXBzCiNUaGlzIHNob3VsZCBiZSBpbnRlcmVzdGluZy4uLiBJIHdhcyBib3JuIGluIEhhd2FpaS4gSXQgaXNuJ3QgcGFydCBvZiB0aGUgbWFwX2RhdGEsIHNvIEknbGwgY2hvb3NlIFV0YWgsIHdoZXJlIEkgbGl2ZWQgZm9yIHR3byB5ZWFycyBhbmQgbGVhcm5lZCB0byBza2kuICBJIGxpdmVkIGluIE9nZGVuIGluIFdlYmVyIGNvdW50eS4gIE15IGluaXRpYWxzIGFyZSBBS0MuIFRoZSBjb3VudGllcyBJIGNob3NlIHRvIHB1dCBpbiBncmF5IGFyZSBLYW5lIGFuZCBDYXJib24uICAgCmBgYHtyfQp1c191dGFoIDwtIG1hcF9kYXRhKG1hcD0ic3RhdGUiLAogICAgICAgICAgICAgICAgICAgICAgcmVnaW9uID0gInV0YWgiKQp1dGFoIDwtIG1hcF9kYXRhKCJjb3VudHkiLCAidXRhaCIpCnV0X2JpcnRoIDwtIHN1YnNldCh1dGFoLCBzdWJyZWdpb24gJWluJSBjKCJ3ZWJlciIpKQp1dF9uYW1lcyA8LSBzdWJzZXQodXRhaCwgc3VicmVnaW9uICVpbiUgYygiY2FyYm9uIiwgImthbmUiKSkKCmFrY191c2EgPC0gZ2dwbG90KCkrCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSB1c191dGFoLAogICAgICAgICAgICAgICBhZXMoeCA9IGxvbmcsCiAgICAgICAgICAgICAgIHkgPSBsYXQsCiAgICAgICAgICAgICAgIGdyb3VwID0gZ3JvdXApLAogICAgICAgICAgICAgICBmaWxsID0gImJsYWNrIikrCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSB1c2EsCiAgICAgICAgICAgICAgIGFlcyh4ID0gbG9uZywKICAgICAgICAgICAgICAgeSA9IGxhdCwKICAgICAgICAgICAgICAgZ3JvdXAgPSBncm91cCksCiAgICAgICAgICAgICAgIGZpbGwgPSBOQSwKICAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siKSsKICB0aGVtZV9tYXAoKSsKICBjb29yZF9maXhlZCgxLjMpCgpha2NfY291bnRpZXMgPC0gZ2dwbG90KCkrCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSB1dF9iaXJ0aCwKICAgICAgICAgICAgICAgYWVzKHggPSBsb25nLAogICAgICAgICAgICAgICAgICAgeSA9IGxhdCwKICAgICAgICAgICAgICAgICAgIGdyb3VwID0gZ3JvdXApLAogICAgICAgICAgICAgICBmaWxsID0gImJsYWNrIikrCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSB1dF9uYW1lcywKICAgICAgICAgICAgICAgYWVzKHggPSBsb25nLAogICAgICAgICAgICAgICAgICAgeSA9IGxhdCwKICAgICAgICAgICAgICAgICAgIGdyb3VwID0gZ3JvdXApLAogICAgICAgICAgICAgICBmaWxsID0gImdyYXkiKSsKICBnZW9tX3BvbHlnb24oZGF0YSA9IHV0YWgsCiAgICAgICAgICAgICAgIGFlcyh4ID0gbG9uZywKICAgICAgICAgICAgICAgICAgIHkgPSBsYXQsCiAgICAgICAgICAgICAgICAgICBncm91cCA9IGdyb3VwKSwKICAgICAgICAgICAgICAgZmlsbCA9IE5BLAogICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIpKwogIHRoZW1lX21hcCgpKwogIGNvb3JkX2ZpeGVkKDEuMykKCmFrY191c2EgKyBha2NfY291bnRpZXMgKyBwbG90X2xheW91dChuY29sID0gMiwgd2lkdGhzID0gYygxLjUsMSkpCmBgYAojVGhlIEhhd2FpaSBHYW1iaXQuLi4gQm9ybiBvbiBPYWh1LCBhbmQgaGF2ZSB2aXNpdGVkIEhhd2FpaSAodGhlIGJpZyBpc2xhbmQpIGFuZCBNYXVpLiBJJ2xsIHNlZSBpZiBJIGNhbiBnZXQgdGhhdCB0byB3b3JrLiAgSSBsb3ZlIHdvcmtpbmcgd2l0aCBtYXBzLiAgICAKYGBge3J9Cmhhd2FpaSA8LSBtYXBfZGF0YSgid29ybGQiLCAiVVNBOkhhd2FpaSIpCmhhd2FpaV9vYWh1IDwtIG1hcF9kYXRhKCJ3b3JsZCIsICJVU0E6SGF3YWlpOk9haHUiKQpvdGhlcl9pc2xhbmRzIDwtIG1hcF9kYXRhKCJ3b3JsZCIsIGMoIlVTQTpIYXdhaWk6SGF3YWlpIiwgIlVTQTpIYXdhaWk6TWF1aSIpKQoKYWtjX3VzYSA8LSBnZ3Bsb3QoKSsKICBnZW9tX3BvbHlnb24oZGF0YSA9IHVzX3V0YWgsCiAgICAgICAgICAgICAgIGFlcyh4ID0gbG9uZywKICAgICAgICAgICAgICAgeSA9IGxhdCwKICAgICAgICAgICAgICAgZ3JvdXAgPSBncm91cCksCiAgICAgICAgICAgICAgIGZpbGwgPSAiYmxhY2siKSsKICBnZW9tX3BvbHlnb24oZGF0YSA9IHVzYSwKICAgICAgICAgICAgICAgYWVzKHggPSBsb25nLAogICAgICAgICAgICAgICB5ID0gbGF0LAogICAgICAgICAgICAgICBncm91cCA9IGdyb3VwKSwKICAgICAgICAgICAgICAgZmlsbCA9IE5BLAogICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIpKwogIHRoZW1lX21hcCgpKwogIGNvb3JkX2ZpeGVkKDEuMykKCmFrY19oYXdhaWkgPC0gZ2dwbG90KCkrCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBoYXdhaWksCiAgICAgICAgICAgICAgIGFlcyh4ID0gbG9uZywKICAgICAgICAgICAgICAgICAgIHkgPSBsYXQsCiAgICAgICAgICAgICAgICAgICBncm91cCA9IGdyb3VwKSwKICAgICAgICAgICAgICAgZmlsbCA9IE5BLAogICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIpKwogIGdlb21fcG9seWdvbihkYXRhID0gaGF3YWlpX29haHUsCiAgICAgICAgICAgICAgIGFlcyh4ID0gbG9uZywKICAgICAgICAgICAgICAgICAgIHkgPSBsYXQsCiAgICAgICAgICAgICAgICAgICBncm91cCA9IGdyb3VwKSwKICAgICAgICAgICAgICAgZmlsbCA9ICJibGFjayIpKwogIGdlb21fcG9seWdvbihkYXRhID0gb3RoZXJfaXNsYW5kcywKICAgICAgICAgICAgICAgYWVzKHggPSBsb25nLAogICAgICAgICAgICAgICAgICAgeSA9IGxhdCwKICAgICAgICAgICAgICAgICAgIGdyb3VwID0gZ3JvdXApLAogICAgICAgICAgICAgICBmaWxsID0gImdyYXkiKSsKICB0aGVtZV9tYXAoKSsKICBjb29yZF9maXhlZCgxLjMpCmFrY191c2EgKyBha2NfaGF3YWlpICsgcGxvdF9sYXlvdXQobmNvbCA9IDIsIHdpZHRocyA9IGMoMS41LCAxKSkKYGBgCiNIbW0uICBUaGUgYmlnIGlzbGFuZCBvZiBIYXdhaWkgZGlkbid0IHNob3cgdXAgYXMgZ3JheS4gIEkgZ3Vlc3MgdGhlIG5hbWUgaW4gbWFwX2RhdGEgaXMgZGlmZmVyZW50LiAgVGhlIGNvZGUgaXMgdGhlcmUgdGhhdCB3b3VsZCBzZWxlY3QgaXQuICBPbiB0byBQYXJ0IDIhCgoqKioKIyMjUGFydCAyOiBEb3QgZGlzdHJpYnV0aW9uIG1hcHMKKioqCiMjI0xvYWQgdGhlIGxpYnJhcmllcyAKI2FscmVhZHkgbG9hZGVkCioqKgojIyNEZWZpbmUgc29tZSB2YXJpYWJsZXMuIHNldC5zZWVkIHZhbHVlIGFzIGluIGFzc2lnbm1lbnQgc28gSSBjYW4gc2VlIGlmIEknbSBkb2luZyBpdCByaWdodCEgCmBgYHtyfQptaW5fbG9uZyA8LSAtMTI2Cm1heF9sb25nIDwtIC0xMDQKbWluX2xhdCA8LSAzMQptYXhfbGF0IDwtIDUwCgpzZXQuc2VlZCg5NjE4OTczKQpmaWxlX3BhdGggPC0ifi9Eb2N1bWVudHMvQkk2ODVGaWxlcy9HaXRIdWJEb2NzL2Nocm9uaXN0ZXJfYW5kcmV3L2RhdGEiCmBgYAoKKioqCiMjI1JlYWQgaW4gdGhlICJHaWdhbnRvcGl0aGVjdXMiIGRhdGEKYGBge3J9CmJpZ2Zvb3QgPC0gcmVhZC5jc3YoZmlsZS5wYXRoKGZpbGVfcGF0aCwgImJpZ2Zvb3QuY3N2IikpCgpiaWdmb290IDwtIGZpbHRlcihiaWdmb290LAogICAgICAgICAgICAgICAgICBsb25nID49IG1pbl9sb25nICYgbG9uZyA8PSBtYXhfbG9uZywKICAgICAgICAgICAgICAgICAgbGF0ID49IG1pbl9sYXQgJiBsYXQgPD0gbWF4X2xhdCkgJT4lCiAgc2FtcGxlX24oMzAwKSAlPiUKICBtdXRhdGUobmFtZSA9ICJHaWdhbnRpb3BpdGhlY3VzIikgJT4lCiAgc2VsZWN0KG5hbWUsIGxvbmcsIGxhdCkKYGBgCiNSZWFkIGluIHRoZSBiZWFycyBkYXRhCmBgYHtyfQpiZWFycyA8LSByZWFkX2NzdihmaWxlLnBhdGgoZmlsZV9wYXRoLCAiYmVhcnMuY3N2IikpCgpib3RoX3NwZWNpZXMgPC0gYmluZF9yb3dzKGJpZ2Zvb3QsIGJlYXJzKQoKaGVhZChib3RoX3NwZWNpZXMpCmBgYApgYGB7cn0KdGFpbChib3RoX3NwZWNpZXMpCmBgYAojR2V0IHRlcnJhaW4gbWFwCmBgYHtyfQpiYXNlID0gZ2V0X3N0YW1lbm1hcChiYm94ID0gYyhtaW5fbG9uZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX2xhdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2xvbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9sYXQpLAogICAgICAgICAgICAgICAgICAgICB6b29tID0gNCwKICAgICAgICAgICAgICAgICAgICAgbWFwdHlwZSA9ICJ0ZXJyYWluLWJhY2tncm91bmQiKQpnZ21hcChiYXNlKQpgYGAKYGBge3J9CmJhc2UgPC0gZ2dtYXAoYmFzZSkKCmJhc2UgKyBnZW9tX3BvaW50KGRhdGEgPSBiaWdmb290LAogICAgICAgICAgICAgICAgICBhZXMoeCA9IGxvbmcsCiAgICAgICAgICAgICAgICAgICAgICB5ID0gbGF0KSkKYGBgCmBgYHtyfQpiYXNlICsgZ2VvbV9wb2ludChkYXRhID0gYmVhcnMsCiAgICAgICAgICAgICAgICAgIGFlcyh4ID0gbG9uZywKICAgICAgICAgICAgICAgICAgeSA9IGxhdCkpCmBgYAojQm90aCBzcGVjaWVzCmBgYHtyfQpiYXNlICsgZ2VvbV9wb2ludChkYXRhID0gYm90aF9zcGVjaWVzLAogICAgICAgICAgICAgICAgICBhZXMoeCA9IGxvbmcsCiAgICAgICAgICAgICAgICAgICAgICB5ID0gbGF0LAogICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgZmlsbCA9IG5hbWUpLAogICAgICAgICAgICAgICAgICBzaXplID0gMikrCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMjI6MjMpKSsKICBsYWJzKHggPSAiTG9uZ2l0dWRlIiwKICAgICAgIHkgPSAiTGF0aXR1ZGUiLAogICAgICAgZmlsbCA9ICJTcGVjaWVzIiwKICAgICAgIHNoYXBlID0gIlNwZWNpZXMiKQpgYGAKKioqCiMjI1JlY3JlYXRlIHdpdGggU08gbnVtYmVyIGFzIHNlZWQuICAKYGBge3J9CnNldC5zZWVkKDEwNjU0NTApCiNJIGNvdWxkIGp1c3QgcmVkbyBldmVyeXRoaW5nIGZyb20gaGVyZSB3aXRoIHRoZSBleGlzdGluZyBjb2RlIGFuZCBzaG91bGQgZ2V0IHRoZSBuZXcgcmVzdWx0cy4gIApiaWdmb290IDwtIHJlYWRfY3N2KGZpbGUucGF0aChmaWxlX3BhdGgsICJiaWdmb290LmNzdiIpKQpiaWdmb290IDwtIGZpbHRlcihiaWdmb290LAogICAgICAgICAgICAgICAgICAgbG9uZyA+PSBtaW5fbG9uZyAmIGxvbmcgPD0gbWF4X2xvbmcsCiAgICAgICAgICAgICAgICAgICBsYXQgPj0gbWluX2xhdCAmIGxhdCA8PSBtYXhfbGF0KSAlPiUKICBzYW1wbGVfbigzMDApICU+JQogIG11dGF0ZShuYW1lID0gIkdpZ2FudG9waXRoZWN1cyIpICU+JQogIHNlbGVjdChuYW1lLCBsb25nLCBsYXQpCmBgYAojQmVhcnMgZGF0YSBhbHJlYWR5IHJlYWQgaW4uICAKYGBge3J9CmJvdGhfc3BlY2llcyA8LSBiaW5kX3Jvd3MoYmlnZm9vdCwgYmVhcnMpCgpoZWFkKGJvdGhfc3BlY2llcykKdGFpbChib3RoX3NwZWNpZXMpCmBgYApgYGB7cn0KYmFzZSA9IGdldF9zdGFtZW5tYXAoYmJveCA9IGMobWluX2xvbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9sYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9sb25nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfbGF0KSwKICAgICAgICAgICAgICAgICAgICAgem9vbSA9IDQsCiAgICAgICAgICAgICAgICAgICAgIG1hcHR5cGUgPSAidGVycmFpbi1iYWNrZ3JvdW5kIikKCmJhc2UgPC0gZ2dtYXAoYmFzZSkKYmFzZSArIGdlb21fcG9pbnQoZGF0YSA9IGJvdGhfc3BlY2llcywKICAgICAgICAgICAgICAgICAgYWVzKHggPSBsb25nLAogICAgICAgICAgICAgICAgICAgICAgeSA9IGxhdCwKICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gbmFtZSwKICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBuYW1lKSwKICAgICAgICAgICAgICAgICAgc2l6ZSA9IDIpKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDIyOjIzKSkrCiAgbGFicyh4ID0gIkxvbmdpdHVkZSIsCiAgICAgICB5ID0gIkxhdGl0dWRlIiwKICAgICAgIGZpbGwgPSAiU3BlY2llcyIsCiAgICAgICBzaGFwZSA9ICJTcGVjaWVzIikKYGBgCioqKgojIyNQYXJ0MzogQmF0aHltZXRyeQoqKioKIyMjTG9hZCB0aGUgbGlicmFyaWVzCiNBbHJlYWR5IGxvYWRlZAoqKioKIyMjRGVmaW5lIHRoZSB2YXJpYWJsZXMKYGBge3J9Cm1pbl9sb25nIDwtIC0xNzAKbWF4X2xvbmcgPC0gMTY0Cm1pbl9sYXQgPC0gLTQyCm1heF9sYXQgPC0gLTgKCmVhcnRocXVha2VzIDwtIHF1YWtlcyAlPiUKICBtdXRhdGUoZGVwdGggPSBkZXB0aCAqIDMyODAuODQpCmBgYAojbG9hZCBOT0FBIGRhdGEKYGBge3J9CmZpamkgPC0gZ2V0Tk9BQS5iYXRoeShsb24xID0gbWluX2xvbmcsCiAgICAgICAgICAgICAgICAgICAgICBsb24yID0gbWF4X2xvbmcsCiAgICAgICAgICAgICAgICAgICAgICBsYXQxID0gbWluX2xhdCwKICAgICAgICAgICAgICAgICAgICAgIGxhdDIgPSBtYXhfbGF0LAogICAgICAgICAgICAgICAgICAgICAgYW50aW1lcmlkaWFuID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgIGtlZXAgPSBUUlVFKQpgYGAKCmBgYHtyfQphdXRvcGxvdC5iYXRoeShmaWppLAogICAgICAgICAgICAgICBnZW9tID0gYygicmFzdGVyIiwgImNvbnRvdXIiKSwKICAgICAgICAgICAgICAgc2l6ZSA9IDAuMywKICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQpgYGAKYGBge3J9CmF1dG9wbG90KGZpamksCiAgICAgICAgIGdlb20gPSBjKCJyYXN0ZXIiLCAiY29udG91ciIpLAogICAgICAgICBzaXplID0gMC4xLAogICAgICAgICBuYS5ybSA9IFRSVUUpKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnQyKGxvdyA9ICJkb2RnZXJibHVlNCIsCiAgICAgICAgICAgICAgICAgICAgICAgbWlkID0gImdhaW5zYm9ybyIsCiAgICAgICAgICAgICAgICAgICAgICAgaGlnaCA9ICJkYXJrZ3JlZW4iLAogICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiRGVwdGggKGZ0KSIpKwogIGxhYnMoeCA9ICJMb25naXR1ZGUiLAogICAgICAgeSA9ICJMYXRpdHVkZSIpKwogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gMC41KSkKYGBgCmBgYHtyfQpiYXNlX21hcCA8LSBhdXRvcGxvdChmaWppLAogICAgICAgICBnZW9tID0gYygicmFzdGVyIiwgImNvbnRvdXIiKSwKICAgICAgICAgc2l6ZSA9IDAuMSwKICAgICAgICAgbmEucm0gPSBUUlVFKSsKICBzY2FsZV9maWxsX2dyYWRpZW50Mihsb3cgPSAiZG9kZ2VyYmx1ZTQiLAogICAgICAgICAgICAgICAgICAgICAgIG1pZCA9ICJnYWluc2Jvcm8iLAogICAgICAgICAgICAgICAgICAgICAgIGhpZ2ggPSAiZGFya2dyZWVuIiwKICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIkRlcHRoIChmdCkiKSsKICBsYWJzKHggPSAiTG9uZ2l0dWRlIiwKICAgICAgIHkgPSAiTGF0aXR1ZGUiKSsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoYW5nbGUgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkpCmBgYApgYGB7cn0KYmFzZV9tYXAgKyBnZW9tX3BvaW50KGRhdGEgPSBlYXJ0aHF1YWtlcywKICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gbG9uZywKICAgICAgICAgICAgICAgICAgICAgIHkgPSBsYXQpKQpgYGAKI1VzZSBhbHBoYSBhcmd1ZW1lbnQKYGBge3J9CmJhc2VfbWFwICsgZ2VvbV9wb2ludChkYXRhID0gZWFydGhxdWFrZXMsCiAgICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IGxvbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGxhdCwKICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gbWFnKSwKICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gMC40KQpgYGAKI3NjYWxlIHNpemUgYSBsaXR0bGUgc21hbGxlcgpgYGB7cn0KYmFzZV9tYXAgKyBnZW9tX3BvaW50KGRhdGEgPSBlYXJ0aHF1YWtlcywKICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gbG9uZywKICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gbGF0LAogICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBtYWcpLAogICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjQpICsKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDAuNSwgMyksIG5hbWUgPSAiTWFnbml0dWRlIikKYGBgCioqKgojIyNOb3cgeW91IHRyeSBpdC4KKioqCiMjI1NldCBuZXcgdmFyaWFibGVzCmBgYHtyfQptaW5fbG9uZyA8LSAtOTAKbWF4X2xvbmcgPC0gLTU4Cm1pbl9sYXQgPC0gOAptYXhfbGF0IDwtIDI4CmBgYAojUmVhZCBpbiB0aGUgZGF0YQpgYGB7cn0KYmxlbm5pZXMgPC0gcmVhZF9jc3YoZmlsZS5wYXRoKGZpbGVfcGF0aCwgImJsZW5uaWVzLmNzdiIpKQpibGVubmllcwpgYGAKI0dldCB0aGUgY2FyaWJiZWFuIGRhdGEKYGBge3J9CmNhcmliX3NlYSA8LSBnZXROT0FBLmJhdGh5KGxvbjEgPSBtaW5fbG9uZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uMiA9IG1heF9sb25nLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsYXQxID0gbWluX2xhdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0MiA9IG1heF9sYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFudGltZXJpZGlhbiA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICBrZWVwID0gVFJVRSkKYGBgCiNVc2UgYXV0b3Bsb3QgZm9yIHRoZSBiYXNlIG1hcApgYGB7cn0KYmFzZV9tYXAgPC0gYXV0b3Bsb3QoY2FyaWJfc2VhLAogICAgICAgICBnZW9tID0gYygicmFzdGVyIiwgImNvbnRvdXIiKSwKICAgICAgICAgc2l6ZSA9IDAuMSwKICAgICAgICAgbmEucm0gPSBUUlVFKSArCiAgc2NhbGVfZmlsbF9ldG9wbyhndWlkZSA9IEZBTFNFKSsKICBsYWJzKHggPSAiTG9uZ2l0dWRlIiwKICAgICAgIHkgPSAiTGF0aXR1ZGUiKSsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoYW5nbGUgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkpCmJhc2VfbWFwCmBgYAojQWRkIHRoZSBibGVubmllcwpgYGB7cn0KYmFzZV9tYXAgKyBnZW9tX3BvaW50KGRhdGEgPSBibGVubmllcywKICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gbG9uZywKICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gbGF0LAogICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gbmFtZSksCiAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gIndoaXRlIiwKICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAzLjIpKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDIxOjIzKSkrCiAgbGFicyhzaGFwZSA9ICJTcGVjaWVzIikrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKwogIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIikpCgpgYGAKCgoK